hyprland end4自动切换neovim主题
本文最后更新于 2025年9月4日 晚上
最近我的hyprland主题一直在使用end-4做的dotfile:illogical-impulse(下面简称ii),基于Quickshell实现,虽然后台占用是大,但是我用起来非常流畅,内存不拿来用不就是浪费吗~
遇到的一个问题是, 当切换主题的日夜间模式时, neonvim的主题并不会切换,如果就用neonvim主题配置中的transparent_background = false
,即背景透明,会导致在ii生成的颜色配置在直接反转颜色后很不好看,于是想着通过配置neovim的主题文件来实现自动切换。
实现的效果
🎨 自动切换
- 启动时检测:Neovim 启动时自动检测当前桌面环境的深浅色模式
- 匹配主题:
- 浅色模式 → 自动应用 Catppuccin Latte(浅色主题)
- 深色模式 → 自动应用 Catppuccin Mocha(深色主题)
- 视觉统一:编辑器主题与 Quickshell 生成的 Material Design 3 终端颜色相协调
🎯 手动切换
- 快捷键切换:
<leader>tl
- 强制切换到浅色主题<leader>td
- 强制切换到深色主题
- 命令行控制:
:ThemeLight
- 切换到浅色主题:ThemeDark
- 切换到深色主题
原理
🔍 检测
数据源:读取 Quickshell 生成的颜色配置文件
- 位置:
~/.local/state/quickshell/user/generated/colors.json
- 位置:
亮度计算:
1
2
3
4
5
6
7-- 提取背景色(如 #f6fafe 或 #101417)
local r = tonumber(hex:sub(1, 2), 16) or 0
local g = tonumber(hex:sub(3, 4), 16) or 0
local b = tonumber(hex:sub(5, 6), 16) or 0
-- 使用 ITU-R BT.709 标准计算相对亮度
local brightness = (r * 299 + g * 587 + b * 114) / 1000判断逻辑:
brightness > 128
→ 浅色环境 →vim.o.background = "light"
brightness ≤ 128
→ 深色环境 →vim.o.background = "dark"
⚙️ Neovim 内部
background 选项:
- Neovim 内置选项,用于告知主题当前环境类型
主题响应:
1
2
3
4background = {
light = "latte", -- vim.o.background = "light" 时使用
dark = "mocha", -- vim.o.background = "dark" 时使用
},自动监听:使用
OptionSet
autocmd 监听background
选项变化,实时切换主题
🔄 工作流程
1 |
|
以下是我的./.config/nvim/lua/plugins/catppuccin.lua
主题文件的配置,可作参考:
1 |
|
注意事项
⚠️ 配置文件路径依赖
Quickshell 数据路径:
- 当前路径:
~/.local/state/quickshell/user/generated/colors.json
- 如果 Quickshell 配置更改了数据生成路径,需要同步更新 Neovim 配置中的路径
🔧 配置维护
主题优先级:
- Catppuccin 设置为
priority = 1000
,确保在其他主题之前加载 - Github-theme 设为
lazy = true
,避免冲突
- Catppuccin 设置为
备用机制:
- 如果颜色文件读取失败,默认设置为浅色模式
- 保留手动切换功能作为备用选项
🐛 故障排除
主题不切换:
- 检查
colors.json
文件是否存在和可读 - 在 Neovim 中运行
:echo vim.o.background
查看检测结果 - 使用
:messages
查看是否有错误信息
- 检查
颜色不协调:
- 检查透明背景设置:
transparent_background = false
- 确认终端颜色序列正常:
cat ~/.local/state/quickshell/user/generated/terminal/sequences.txt
- 检查透明背景设置:
手动测试:
1
2
3-- 在 Neovim 中测试
:lua print(vim.fn.expand("~/.local/state/quickshell/user/generated/colors.json"))
:lua print(vim.fn.filereadable(vim.fn.expand("~/.local/state/quickshell/user/generated/colors.json")))
📂 相关文件位置
- Neovim 主题配置:
~/.config/nvim/lua/plugins/catppuccin.lua
- Quickshell 颜色数据:
~/.local/state/quickshell/user/generated/colors.json
- 终端颜色序列:
~/.local/state/quickshell/user/generated/terminal/sequences.txt
- Quickshell 主配置:
~/.config/illogical-impulse/config.json
我的环境:Arch Linux + Hyprland +illogical-impulse(dot-file) + Neovim + LazyVim
hyprland end4自动切换neovim主题
https://inkcodes.com/2025/09/04/hyprland end4自动切换neovim主题/